package com.microservice.wechat.initializer;

import com.microservice.wechat.service.WechatTokenService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * Token初始化器
 * 在应用启动时自动初始化所有微信公众号的access_token
 * 
 * @author wechat-service
 * @date 2025-01-11
 */
@Slf4j
@Component
@Order(1) // 设置启动顺序，确保在其他组件之前初始化
public class TokenInitializer implements ApplicationRunner {

    @Autowired
    private WechatTokenService wechatTokenService;

    /**
     * 是否在启动时初始化Token（默认true）
     * 可通过配置文件 wechat.token.init-on-startup 控制
     */
    @Value("${wechat.token.init-on-startup:true}")
    private Boolean initOnStartup;

    /**
     * 应用启动后执行
     * 
     * @param args 应用启动参数
     */
    @Override
    public void run(ApplicationArguments args) {
        // 检查是否启用启动初始化
        if (!initOnStartup) {
            log.info("【Token初始化】启动初始化已禁用，跳过Token初始化");
            return;
        }

        log.info("╔════════════════════════════════════════════════════════════╗");
        log.info("║          开始初始化微信Token                                ║");
        log.info("╚════════════════════════════════════════════════════════════╝");
        
        try {
            long startTime = System.currentTimeMillis();
            
            // 调用服务层的批量刷新方法
            wechatTokenService.refreshAllTokens();
            
            long endTime = System.currentTimeMillis();
            long duration = endTime - startTime;
            
            log.info("╔════════════════════════════════════════════════════════════╗");
            log.info("║          Token初始化完成 - 耗时: {}ms                    ", duration);
            log.info("╚════════════════════════════════════════════════════════════╝");
            
        } catch (Exception e) {
            log.error("╔════════════════════════════════════════════════════════════╗");
            log.error("║          Token初始化失败                                    ║");
            log.error("╚════════════════════════════════════════════════════════════╝");
            log.error("Token初始化异常: {}", e.getMessage(), e);
            
            // 不抛出异常，避免影响应用启动
            // 后续可以通过定时任务刷新Token
            log.warn("Token初始化失败不影响应用启动，后续将通过定时任务自动刷新");
        }
    }
}
